KeyWords: Nmap, SQLi, SSTI, docker breakout, RCE, permissions SUID.
Palabras Clave: Nmap, SQLi, SSTI, docker breakout, RCE, permisos SUID.
Se emplea la herramienta Nmap para hacer el reconocimiento de puertos de la máquina Horizontall y de esta forma conocer cuales están abiertos.
> nmap -p- --open -sS --min-rate 1000 -vvv -n -Pn 10.10.11.130 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-28 14:35 CET
Initiating SYN Stealth Scan at 14:35
Scanning 10.10.11.130 [65535 ports]
Discovered open port 80/tcp on 10.10.11.130
Completed SYN Stealth Scan at 14:35, 30.47s elapsed (65535 total ports)
Nmap scan report for 10.10.11.130
Host is up, received user-set (0.049s latency).
Scanned at 2024-01-28 14:35:20 CET for 30s
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 30.63 seconds
Raw packets sent: 65932 (2.901MB) | Rcvd: 65844 (2.634MB)
| Parámetros Nmap | |
|---|---|
| -p- | Escanea todos los 65535 puertos |
| –open | Solo muestra los puertos abiertos |
| -sS | Escaneo TCP SYN |
| –min-rate | Envío mínimo de paquetes |
| -vvv | Muestra la información del escaneo mientras está ejecutándose |
| -n | No realiza resolución DNS |
| -Pn | No realiza Host Discovery |
| -oG | Exporta el output en un archivo con formato grepeable |
Se confirma que tiene abiertos los siguientes puertos: 22 (ssh) y 80 (http), por lo que mediante el archivo grepeable que creamos anteriormente, se hara uso de una función personalidada en la .zshrc, que extrae y copia a la clipboard los puertos resultantes de la primera consulta nmap para luego pegarlos en una siguiente.
> extractPorts allPorts
[+] Extracting Information....
[+] IP Address: 10.10.11.130
[+] Open Ports: 80
[+] Ports copied to clipboard
Con esta siguiente consulta se buscará enumerar que servicios están expuertos y sus respectivas versiones.
> nmap -sCV -p80 10.10.11.130 -oN targeted
Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-28 14:47 CET
Nmap scan report for internal-administration.goodgames.htb (10.10.11.130)
Host is up (0.039s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.51
| http-title: Flask Volt Dashboard - Sign IN | AppSeed
|_Requested resource was http://internal-administration.goodgames.htb/login
| http-server-header:
| Werkzeug/2.0.2 Python/3.6.7
|_ Werkzeug/2.0.2 Python/3.9.2
Service Info: Host: goodgames.htb
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.41 seconds
| Parámetros Nmap | |
|---|---|
| -sC | Conjunto de Scripts básicos de reconocimiento |
| -sV | Verificación de las versiones de los servicios expuestos |
| -oN | Guarda el output en un archivo |
En la etapa de reconocimiento, se llegó a observar que está abierto el puerto 80. Se procede a enumerar la página expuesta.
Con el uso de la herramienta whatweb se logra enumerar las tecnologías que usa la página. En el resultado se observa que es que corre por detrás python, importante tener en cuenta esta información.
Se encuentra un ventana para iniciar sesión, este puede ser un vector interesante de ataque. Por lo que se captura la petición con burpsuite y se lo pasa al Repeater.
En la petición se prueba realizar una inyección SQL y se confirma que el campo email es vulnerable.
Sabiendo que el campo email es vulnerable a SQLi, se procede a enumerar cuantas columnas tiene mediante la sentencia ORDER BY, por lo que se va a ir probando hasta que muestre algún error. Después de enumerar se observa que tiene un total de cuatro columnas y esta última columna se muestra en pantalla, brindando la posibilidad de poder obtener información de manera mucho más sencilla.
Usando la sentencia SQL, database(), se llega a conocer la base de datos actual, cuyo nombre es "main".
Conociendo el nombre de la base de datos, se procede a enumerar las tablas. Dentro de las tablas enumeradas se logra observar una con nombre "user", misma que puede llegar a ser interesante conocer las columnas que posee.
Teniendo en conocimiento las columnas que posee la tabla user, se descubre que el contenido de esta tabla son las credenciales del usuario admin.
El password está hasheado en md5, a razón que tiene un total de 32 carácteres. Se va copiar el password a un archivo que se llamará hash y por medio de john se logrará descifrarlo. La password de admin es 'superadministrator'.
Con las credenciales obtenidas se procede a inciar sesión.
Dándole click a la tuerca, lleva a un subdominio que se tendrá que agregar al archivo /etc/hosts.
En el subdominio se observa otro panel de autenticación, donde se va a probar las credenciales obtenidas anteriormente, que al colocarlas se ingresa a un panel de administración.
En la sección de configuración (Settings) se prueba que el campo FullName sea vulnerable a Server Side Template Injection (SSTI), y en este caso se confirma que lo es.
En la página HackTricks, se busca por SSTI. Dentro de la sección de SSTI se observa en la sección de python para conocer como ejecutar comandos remotos.
Se captura la petición para poder enviar el payload.
En el Repeater del burpsuite se procede a realizar el envío del payload que tiene que estár urlencodeado, para que se logre enviar correctamente, para ello cuando se termine de colocar el one liner para obtener la reverse shell se selecciona todo el payload y se presiona la siguiente combinación ctrl+u. Estando en escucha por el puerto 443 en nuestra máquina de atacante se obtiene una shell como el usuario root dentro de un docker.
Dentro del contenedor, se averigua cual es la ip del host.
Teniendo en cuenta la ip del host, se busca que puertos internos están abiertos mediante el uso de bash.
for port in $(seq 1 65535); do timeout 1 bash -c "echo '' > /dev/tcp/172.19.0.1/$port" 2>/dev/null && echo "[+] Puerto Abierto $port"; done
Se observa que el puerto 22 se encuentra abierto, por lo que ahora toca buscar usaurios y se en la carpeta /home se encuentra la carpeta augustus, que al conocer sus permisos se ve que el usuario no existe por lo que se puede asumir que esta carpeta está montada en el contenedor.
Teniendo el nombre de augustus como usuario se prueba si existe nuevamente reuso de credenciales colocando la contraseña 'superadministrator' al iniciar sesión por ssh. Se obtiene la shell como el usuario augustus dentro del host, capturando la user flag.
Conociendo que la carpeta augustus del host está montada en el contenedor. Dentro del host, se procede a copiar el binario /bin/bash en /home/augustus, y se regresa la contenedor con el comando exit.
Estando en el contendor se cambia de usuario del archivo bash, se coloca como owner al usuario root y se asignan permisos SUID.
Se regresa al host y al ejecutar esta archivo se obtiene una bash con privilegios, escalando y capturando la última flag.